#include <iostream>
#include <vector>
#include <climits>
#include <unordered_map>
using namespace std;

struct Point
{
	int x;
	int y;
	Point() : x(0), y(0) {}
	Point(int a, int b) : x(a), y(b) {}
};
// 87.64 %
class Solution
{
  public:
	int maxPoints(vector<Point> &points)
	{
		if (points.size() == 0)
			return 0;
		if (points.size() == 1)
			return 1;
		int res = -1;
		int same = 0;
		for (int i = 0; i < points.size(); i++)
		{
			same = 0;
			unordered_map<double, int> record;
			for (int j = 0; j < points.size(); j++)
				if (j != i)
				{
					if (points[i].x == points[j].x && points[i].y == points[j].y)
					{
						same++;
					}
					else
					{
						record[k(points[i], points[j])]++;
					}
				}
			if (record.size() == 0)
				res = same;
			else
				for (unordered_map<double, int>::iterator iter = record.begin(); iter != record.end(); iter++)
				{
					res = res > iter->second + same ? res : iter->second + same;
				}
			same = 0;
		}
		return res + 1;
	}
	double k(const Point &pa, const Point &pb)
	{
		if (pa.x != pb.x)
			return 1000.0 * (pa.y - pb.y) / (pa.x - pb.x);
		return INT_MAX;
	}
};

int main()
{
	vector<Point> myVector;
	int arr[][2] = {
		{0, 0},
		{94911151, 94911150},
		{94911152, 94911151}};
	int len = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < len; i++)
	{
		myVector.push_back(Point(arr[i][0], arr[i][1]));
	}
	cout << Solution().maxPoints(myVector) << endl;
	return 0;
}
